package goframe

import (
	"context"

	"github.com/glennliao/apijson-go/action"
	"github.com/glennliao/apijson-go/config"
	gfConfig "github.com/glennliao/apijson-go/drivers/goframe/config"
	gfExecutor "github.com/glennliao/apijson-go/drivers/goframe/executor"
	"github.com/glennliao/apijson-go/query"
	"github.com/gogf/gf/v2/database/gdb"
	"github.com/gogf/gf/v2/frame/g"
)

func C初始化() {
	// 注册访问列表提供者
	config.Z注册访问列表提供者(gfConfig.T提供者名称, gfConfig.F访问列表数据库提供者)

	// 注册请求列表提供者
	config.Z注册请求列表提供者(gfConfig.T提供者名称, gfConfig.Q获取请求配置列表)

	// 注册数据库元信息提供者
	config.Z注册数据库元信息提供者(gfConfig.T提供者名称, gfConfig.S数据库元数据提供者)

	// 注册默认查询执行器
	query.Z注册执行器("default", gfExecutor.X新建执行器)

	// 注册默认动作执行器
	action.X注册执行器("default", &gfExecutor.C操作执行器{
		S数据库解析器: func(ctx context.Context) gdb.DB {
			return g.DB()
		},
	})

	// 注册事务解析器
	action.Z注册事务解析器(func(ctx context.Context, 请求 *action.C操作) action.S事务处理函数 {
		return func(ctx context.Context, 操作函数 func(ctx context.Context) error) error {
			return g.DB().Ctx(ctx).Transaction(ctx, func(ctx context.Context, 事务 gdb.TX) error {
				return 操作函数(ctx)
			})
		}
	})
}
